package main

/*
一、init函数
1.init 函数的作用 go 语言中 函数用于包（package）的初始化，该函数是Go语言的一个重要特征。
主要作用是：
	初始化不能采用初始化表达式，初始化的变量
	程序运行前的注册
	实现sync.Once功能
	其他
2. init 函数的特征
	1.init 函数用于程序执行前，（程序执行从main函数开始，init 位于main之前执行）做包的初始化函数，比如函数包里的变量等
	2.init 函数没有输入参数，返回值
	3.每个包可以拥有多个init 函数
	4.包的每个源文件也可以拥有多个init函数
	5.关于源文件内部、同一个包、不同包中的多个init函数的执行顺序规律在接下来详述
	6.init函数不能被其他函数调用，而是在main函数执行前执行，自动被程序调用

3.多个init函数的执行顺序
	1.对于同一个go 文件的init() 调用顺序是从上到下的。
	2.对同一个package中的不同文件是按照文件名字符串比较“从小到大”顺序调用各文件的init 函数。
	3.对于不同的package,如果不相互依赖的话，按照main 包中“先import的后调用”的顺序调用其包中的init() 函数，
	  如果package存在依赖，则先调用最早被依赖的package中的init(),	最后调用main函数。也就是说包之间存在依赖关系的话，
	  会先调用没有依赖关系的包的init().依次到依赖关系最多的包。
	4.如果init函数中使用了println()或者 print() 你会发现在执行过程中这两个不会按照你想象中的顺序执行，
	  这两个函数官方只推荐在测试环境中使用，对于正式环境不要使用

4.Go 程序的初始化
	golang 程序初始化优先于main函数执行，由 runtime 进行初始化，初始化顺序如下：
	1.初始化导入的包（包的初始化顺序并不是按导入顺序 “从上到下” 执行的，runtime需要解析包依赖关系，
	  最先初始化没有依赖的包 ，与变量初始化依赖关系类似）
	2.初始化包作用域的变量（该作用域的变量的初始化也并非按照 “从上到下、从左到右” 的顺序，
	  runtime解析变量依赖关系，最先初始化没有依赖的变量）
	3.执行包的 init 函数
*/
